//
//  main.m
//  OC_04_字符串和数组
//
//  Created by wyx on 16/2/29.
//  Copyright © 2016年 Apon. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
#pragma mark - 知识点1 NSString 不可变字符串
    
    /** NSString: 创建以后, 内容和长度不能改变. */
    
    
#if 0    /** 初始化(init)  */
    NSString *str1 = [[NSString alloc] initWithString:@"iphone"];
    /** 字面量写法,推荐此写法 */
    NSString *str2 = @"iphone";
    /** 格式化方法 */
    NSString *str3 = [[NSString alloc] initWithFormat:@"I have an %@",str1];
    NSLog(@"str3 :%@",str3);
    
    int a = 100;
    NSString *str4 = [[NSString alloc] initWithFormat:@"%d",a];
    NSLog(@"str4:%@",str4);/** 注意,此时100是字符串 */
#endif
#if 0    /** 便利构造器(string) */
    NSString *str1 = [NSString stringWithString:@"iphone"];
    /** 格式化方法 */
    NSString *str2 = [NSString stringWithFormat:@"I have an %@",str1];
    NSLog(@"str2:%@",str2);
#endif
#if 0    /** 获取字符串长度(length) */
    NSString *str1 = @"I have an iphone";
    NSLog(@"%ld", str1.length);/** 使用. 语法调用属性值 */
    NSLog(@"%ld",[str1 length]);/** 使用消息语法 */
#endif
    /** 获取字符串中字符(character) */
#if 0
    NSString *str1 = @"abcde";
    // 需求,取出字符'd'
    unichar c = [str1 characterAtIndex:3];
    NSLog(@"c:%c",c);
#endif
    /** 字符串是否相等(equal) */
#if 0
    NSString *str1 = @"Tom";
    NSString *inputStr2 = @"tom";
    BOOL isEqual = [str1 isEqualToString:inputStr2];
    if (isEqual) {
        NSLog(@"用户存在");
    }
    else{
        NSLog(@"用户不存在");
    }
    
#endif
    /** 获取子串(sub) */
#if 0
    NSString *str1 = @"I have an iphone";
    //获取字符串"iPhone"
    NSString *str2 = [str1 substringFromIndex:10];
    NSLog(@"str2:%@",str2);
    //获取字符串"have"
    NSRange rang = NSMakeRange(2, 4);/** 使用函数创建 NSRange 结构体 */
    NSString *str3 = [str1 substringWithRange:rang];
    NSLog(@"str2:%@",str3);
    //获取字符串"I"
    NSString *str4 = [str1 substringToIndex:1];
    NSLog(@"str2:%@",str4);
    
    //连写
    NSString *str5 = [str1 substringWithRange:NSMakeRange(2, 4)];
    NSLog(@"str5:%@",str5);
    
#endif
    /** 拼接字符串(append)  */
#if 0
    NSString *str1 = @"I have an iphone";
    NSString *str2 = @"6s";
    NSString *str3 = [str1 stringByAppendingString:str2];
    NSLog(@"str3:%@",str3);
#endif
    /** 替换字符串(replace) */
#if 0
    NSString *str1 = @"I have an iphone";
    NSLog(@"str:%@",[str1 stringByReplacingCharactersInRange:NSMakeRange(10, 6) withString:@"huawei"]);
    NSLog(@"str:%@",[str1 stringByReplacingOccurrencesOfString:@"iphone" withString:@"xiaomi"]);
    
#endif
    /** 字符串对象转化为int类型(int) */
#if 0
    int a = 100;
    NSString *number = [NSString stringWithFormat:@"%d",a];
    int newA = number.intValue;
    NSLog(@"number:%d",newA);
    
#endif
    /** 字符串对象转化为其他数据类型, 例如double, float, BOOL等. */
#if 0
    /** 详见 API 查询关键字 Value */
    
#endif
    /** 字符串全部大写(uppercase) */
#if 0
    NSString *str = @"I have an iphone";
    NSLog(@"str:%@",[str uppercaseString]);
#endif
    /** 字符串全部小写(lowercase) */
#if 0
    NSString *str = @"I have an iphone";
    NSLog(@"str:%@",[str lowercaseString]);
    
#endif
    /** 字符串首字母大写(capitalized) */
#if 0
    NSString *str = @"i have an iphone";
    NSLog(@"str:%@",[str capitalizedString]);
    
#endif
    /** 是否以指定字符串为前缀(prefix) */
#if 0
    NSString *str = @"www.baidu.com";
    BOOL new = [str hasPrefix:@"www"];
    if (new) {
        NSLog(@"是以 www开头");
    }
    else{
        NSLog(@"不是");
    }
#endif
    /** 是否以指定字符串为后缀(suffix) */
#if 0
    NSString *str = @"www.baidu.com";
    BOOL new = [str hasSuffix:@"com"];
    if (new) {
        NSLog(@"是以 com结尾");
    }
    else{
        NSLog(@"不是");
    }
    
#endif
    /** 字面量 */
    // 详见 上面
    
    /** 练习: http://www.lanou3g.com/icon.png 判断上述字符串中是否以“png”结尾，如果是就替换成“jpg”，如果不是，就拼接”.jpg”。*/
#if 0
    NSString *str = @"http://www.lanou3g.com/icon.png";
    NSString *newUrl = nil;
    if ([str hasSuffix:@"png"]) {
        newUrl = [str stringByReplacingOccurrencesOfString:@"png" withString:@"jpg"];
        //NSLog(@"str:%@",str1);
    }
    else{
        newUrl = [str stringByAppendingFormat:@".jpg"];
        //NSLog(@"str:%@",str2);
    }
    NSLog(@"str:%@",newUrl);
#endif
    
    
#pragma mark - 知识点 NSMutableString 可变字符串
    
    /**
     * NSMutableString: 创建以后内容还可以修改, 可以进行增, 删, 改等操作.
     * 是NSString的子类
     * 注: 涉及到可变的类, 关键字是mutable.
     */
    
    
    /** 初始化方法(init) */
#if 0
    NSMutableString *mStr = [[NSMutableString alloc] initWithCapacity:20];
    
    
#endif
    
    /** 便利构造器(string) */
#if 0
    NSMutableString *mStr2 = [NSMutableString stringWithCapacity:20];
    
#endif
    /** 拼接字符串(append) */
#if 0
    NSMutableString *mStr1 = @"i have an iphone".mutableCopy;
    [mStr1 appendString:@"6s"];
    NSLog(@"mStr1:%@",mStr1);
    //[mStr1 stringByAppendingString:@"6s"];
    
#endif
    /** 插入字符串(insert) */
#if 0
    NSMutableString *mStr = @"i have iphone".mutableCopy;
    [mStr insertString:@" an" atIndex:6];
    NSLog(@"%@",mStr);
    
#endif
    /** 删除字符串(delete) */
#if 0
    NSMutableString *mStr = @"i have iphone".mutableCopy;
    //[mStr deleteCharactersInRange:NSMakeRange(2, 4)];
    //NSLog(@"%@",mStr);
    //查找是否含有"an"字符串
    NSRange rang = [mStr rangeOfString:@"have"];
    [mStr deleteCharactersInRange:rang];
    NSLog(@"%@",mStr);
#endif
    /** 替换字符串(replace) */
#if 0
    NSMutableString *mStr = @"i have an iphone".mutableCopy;
    NSRange rang = [mStr rangeOfString:@"iphone"];
    [mStr replaceCharactersInRange:rang withString:@"xiaomi"];
    NSLog(@"%@",mStr);
    
    
#endif
    /** 重置字符串(set) */
#if 0
    NSMutableString *mStr = @"i have an iphone".mutableCopy;
    [mStr setString:@"huwei"];
    NSLog(@"%@",mStr);
#endif
    
    /**
     * 不可变字符串:
     * 本身不能被修改.
     * 对不可变字符串的修改操作, 都是操作字符串的副本, 得到一个新的字符串并返回.
     * 可变字符串:
     * 本身能被修改.
     * 可变字符串修改的是原字符串, 因此可变字符串的操作方法没有返回值.
     */
    
    
    /** 练习: 用NSMutableString完成下述功能：
     http://www.lanou3g.com/icon.png
     判断上述字符串中是否以“png”结尾，如果是就替换成“jpg”，如果不是，就拼接”.jpg”。
     */
    
#pragma mark - 知识点2 NSNumber 数值类
    
    /** 作用: 实现基本数据类型和对象类型的相互转化. */
    
    
    /** int类型转化为NSNumber类型的对象 */
#if 0
    int a = 100;
    //初始化
    NSNumber *intNumber1 = [[NSNumber alloc] initWithInt:a];
    NSLog(@"%@",intNumber1);
    //构造器
    NSNumber *intNumber2 = [NSNumber numberWithInt:a];
    NSLog(@"%@",intNumber2);
    //字面量
    NSNumber *intNumber3 = @(a);
    NSNumber *intNumber4 = @20;
    /** 注意@"20"字面量创建的是字符串对象
        @20 字面量创建的是 NSNumber 对象
     */
#endif
    /** float类型转化为NSNumber类型的对象 */
    
    
    /** char类型转化为NSNumber类型的对象 */
    
    
    /** NSNumber类型对象转化为int类型的数据 */
#if 0
    NSNumber *num1 = @20;
    int num2 = [num1 intValue];
    NSLog(@"num2:%d",num2);
#endif
    
    /** NSNumber类型对象转化为float类型的数据 */
    
    /** NSNumber类型对象转化为char类型的数据 */
    
    /** NSNumber类型对象的比较(compare) */
#if 0
    NSNumber *num1 = @100;
    NSNumber *num2 = @100;
    if ([num1 compare:num2] == NSOrderedAscending) {
        NSLog(@"num1大于num2");
    }
    else if ([num1 compare:num2] == NSOrderedDescending){
        NSLog(@"num1小于num2");
    }
    else{
        NSLog(@"num1等于num2");
    }
    
#endif
    /** 字面量 */
    
    
#pragma mark - 知识点3 NSValue
    
    /** 作用之一: 结构体和对象类型的转化. */
    /** NSRange类型转化为NSValue类型的对象 */
#if 1
    //NSRange rang1 = {2,10};
    NSRange rang2 = NSMakeRange(2, 10);
    NSValue *rang3 = [NSValue valueWithRange:rang2];
    NSLog(@"%@",rang3);
    

    
    /** NSValue类型转化为NSRange类型的结构体变量 */

    NSRange rang4 = rang3.rangeValue;
    NSLog(@"ranger3: %ld, %ld", rang4.location, rang4.length);
#endif

    /** 指针转化为NSValue. */
#if 0
    int b = 100;
    int *p = &b;
    NSValue *value = [NSValue valueWithPointer:p];
    NSLog(@"%@", value);

    /** NSValue 转化为 指针. */

    int *p2 = [value pointerValue];
    NSLog(@"%d",*p2);
    
#endif
    /** 自定义结构体转化为NSValue对象 */
    
    /** NSValue对象转化为自定义结构体 */
    
    return 0;
}
